'''此模块用于统一管理所有特殊财务文件类型。

'''

from datatoolsobj.templates.finance.finace_t1 import FinaceType_1
from datatoolsobj.templates.finance.finace_t2 import FinaceType_2
from datatoolsobj.templates.finance.finace_t3 import FinaceType_3

class FinaceType():
    '''所有财务类型数据文件模版都由此类处理。
    整体按照应用分为两部分：
        1.当传入的数据为DataFrame表时，一般表示判断文件类型。
        2.当传入的数据为字符串时，表示使用指定类型进行特殊处理。
    '''
    fts = [FinaceType_1,FinaceType_2,FinaceType_3]
    def __init__(self,data):
        '''初始化财务类型对象
        data：表示要检测类型的头部数据帧。
        '''
        self._type = None
        self._data = data
            
        for tp in FinaceType.fts:
            try:
                special_date,coord_date = tp.detect(self._data)
                if special_date:
                    self._type = tp.name
                    self._cur_type = tp
                    break
            except RuntimeError as e:
                continue

        if not self._type:
            self._type = 'normal'
            self._cur_type = None

    def getName(self):
        '''获取字符串表示的当前数据类型，如非特殊类型则返回normal
        '''
        return self._type

    def unification(self,data=None):
        '''对当前所表示特殊类型的对象进行统一处理，去掉特殊化。
        '''
        if not data:
            data = self._data
        if self._cur_type:
            self._cur_type.unification(data)

    def defaultFindLedger(data,file_info):
        '''无特殊类型时，使用默认方式获取财务数据的科目数据。
        data:通过walkExcelHeaders以此函数进行回调时传入的数据文件的头部数据。
        file_info：此文件在myexcel.findUseColumns中列使用配置后生成的每行数据。
        '''
        tmp = data.dropna(how='all',axis=1)
        for _,line in tmp.iterrows():
            line = line.dropna()
            find = line.str.match('.*科目：(.*)')
            if find.empty:
                continue
            find_km = line[find.values].values
            if len(find_km) != 0:
                return {'文件编号':file_info['文件编号'],
                        '科目名称':find_km[0]}
        return None

    def findLedger(data,file_info):
        '''按照当前对象的类型，使用对应的特殊处理方式获取财务数据的科目数据。
        data:通过walkExcelHeaders以此函数进行回调时传入的数据文件的头部数据。
        file_info：此文件在myexcel.findUseColumns中列使用配置后生成的每行数据。
        '''
        file_hdr_type = file_info['模板类型']
        cur_type = None

        for tp in FinaceType.fts:
            if file_hdr_type == tp.name:
                cur_type = tp
                break
        if not cur_type:
            cur_type = None
        if cur_type:
            result = cur_type.findLedger(data,file_info)
        else:
            result = FinaceType.defaultFindLedger(data,file_info)
        return result